package com.sefonsoft.dataanalysis.utils;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;

import org.springframework.core.io.support.PropertiesLoaderUtils;

/**
 * 读写config.properties文件
 * @author ccf
 *
 */
public class PropertiesUtils {

	
	/**
	 * 属性文件的路径   
	 */
    static String profilepath = PropertiesUtils.class.getClassLoader().getResource("config.properties").getPath();  
   
    /**  
    * 采用静态方法  
    */   
    private static Properties props = new Properties();

    static {   
        try {   
        	props = PropertiesLoaderUtils.loadAllProperties("config.properties");
        } catch (FileNotFoundException e) {   
            e.printStackTrace();   
            System.exit(-1);   
        } catch (IOException e) {          
            System.exit(-1);   
        }   
    }    
    /**
     * 重新加载文件
     */
    public void load(){
        try {   
        	props = PropertiesLoaderUtils.loadAllProperties("config.properties");
        } catch (FileNotFoundException e) {   
            e.printStackTrace();   
            System.exit(-1);   
        } catch (IOException e) {          
            System.exit(-1);   
        }  
    }
    
    /**  
    * 读取属性文件中相应键的值  
    * @param key  
    *            主键  
    * @return String  
     * @throws IOException 
    */   
    public static String getKeyValue(String key) {  
        return props.getProperty(key);   
    }   
  
    /**  
    * 根据主键key读取主键的值value  
    * @param filePath 属性文件路径  
    * @param key 键名  
    */   
    public static String readValue(String filePath, String key) {   
        Properties props = new Properties();   
        try {   
            InputStream in = new BufferedInputStream(new FileInputStream(   
                    filePath));   
            props.load(in);   
            String value = props.getProperty(key);   
            System.out.println(key +"键的值是："+ value);   
            return value;   
        } catch (Exception e) {   
            e.printStackTrace();   
            return null;   
        }   
    }   
      
    /**  
    * 更新（或插入）一对properties信息(主键及其键值)  
    * 如果该主键已经存在，更新该主键的值；  
    * 如果该主键不存在，则插件一对键值。  
    * @param keyname 键名  
    * @param keyvalue 键值  
    */   
    public static void writeProperties(String keyname,String keyvalue) {          
        try {   
            // 调用 Hashtable 的方法 put，使用 getProperty 方法提供并行性。   
            // 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。   
            OutputStream fos = new FileOutputStream(profilepath);   
            props.setProperty(keyname, keyvalue);   
            // 以适合使用 load 方法加载到 Properties 表中的格式，   
            // 将此 Properties 表中的属性列表（键和元素对）写入输出流   
            props.store(fos, "Update '" + keyname + "' value");   
        } catch (IOException e) {   
            System.err.println("属性文件更新错误");   
        }   
    }   
  
    /**  
    * 更新properties文件的键值对  
    * 如果该主键已经存在，更新该主键的值；  
    * 如果该主键不存在，则插件一对键值。  
    * @param keyname 键名  
    * @param keyvalue 键值  
    */   
    public static void updateProperties(Map<String,String> map) {   
        try {   
        	props = PropertiesLoaderUtils.loadAllProperties("config.properties"); 
            // 调用 Hashtable 的方法 put，使用 getProperty 方法提供并行性。   
            // 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。   
            OutputStream fos = 
            		new FileOutputStream(profilepath); 
            for(Entry<String,String> entry: map.entrySet()){
            	props.setProperty(entry.getKey(), entry.getValue());   
            }
            props.store(fos, "");   
            // 以适合使用 load 方法加载到 Properties 表中的格式，   
            // 将此 Properties 表中的属性列表（键和元素对）写入输出流   
        } catch (IOException e) {   
            System.err.println("属性文件更新错误");   
        }   
    }   
    /**
     * 获取文件内容
     * @param fileName
     * @throws IOException 
     */
    public static String getFileContent(String fileName) {
    	String path = PropertiesUtils.class.getClassLoader().getResource("/").getPath();
		File file = new File(path+"../../file");
		if(!file.exists()){
			file = new File("D:\\workpace\\myssm\\src\\main\\webapp\\file");
			System.out.println("文件不存在");
		}
		File[] f = file.listFiles();
		StringBuffer sb = new StringBuffer();
		for (File file2 : f) {
			if(file2.getName().equals(fileName)&&file2.isFile()){
				BufferedReader reader = null;  
				try {
			    reader = new BufferedReader(new FileReader(file2));
				String tempString = null;  
	              // 一次读入一行，直到读入null为文件结束  
				while ((tempString = reader.readLine()) != null) {  
				    // 显示行号  
					sb.append(tempString+"\r\n");
				}
				reader.close();  
				} catch (IOException e) {
					e.printStackTrace();
				} finally{
					 if (reader != null) {  
			                try {  
			                    reader.close();  
			                } catch (IOException e1) {  
			                }  
			            }  
				}
					
			}
		}
		return sb.toString();
	}
    
    public static void main(String[] args) throws IOException {
    	String str = PropertiesUtils.getKeyValue("data.address");
    	System.out.println(str);
    	System.out.println(profilepath);
//    	  File file2 = new File("D:\\workpace\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps");
//    	  BufferedReader reader = null;  
//		  reader = new BufferedReader(new FileReader(file2));
//		  String tempString = null;  
//          int line = 1;  
//        // 一次读入一行，直到读入null为文件结束  
//          while ((tempString = reader.readLine()) != null) {  
//            // 显示行号  
//            System.out.println("line " + line + ": " + tempString);  
//            line++;  
//        }  
//          System.out.println(file2.getName());
//          System.out.println(File.separator);
//        reader.close();  
	}
    
}
